//
//  NSString+MFDES.m
//  24-加密
//
//  Created by mafeng on 16/8/16.
//  Copyright © 2016年 mafeng. All rights reserved.
//

#import "NSString+MFDES.h"
#import <CommonCrypto/CommonCrypto.h>
// key 必须8位
#define key @"01234567"
// 向量
static Byte iv[] = {1, 2, 3, 4, 5, 6, 7, 8};

@implementation NSString (MFDES)

// 1. 字符串对称加密(DES)
- (NSString *)stringWithDES{
    // 1. 将字符串本身转化为C字符串
    const char *string = [self UTF8String];
    // 2. 接收容器
    unsigned char byte[1024];
    // 3. 容器大小
    size_t dataOutMoved = 0;
    // 4. DES加密过程
    // 1. 参数1. 加密 或者 解密
    // 2. 参数2: 加密 / 解密 方式
    // 3. 参数3: 分组密码的选项
    // 4. 参数4: 秘钥
    // 5. 参数5: 秘钥的大小
    // 6. 参数6: 向量
    // 7. 参数7: c的字符串
    // 8. 参数8: 字符串的长度
    // 9. 参数9: 接收容器
    // 10. 参数10: 容器的大小
    // 11. 参数11: 容器最终的个数
    CCCryptorStatus cryptorStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, string, strlen(string), byte, 1024, &dataOutMoved);
    
    if (cryptorStatus == kCCSuccess) {
        // 转成字符串 ==== base64返回
        NSLog(@"加密成功");
        NSData *desData = [NSData dataWithBytes:byte length:dataOutMoved];
        NSString *desBaseString = [desData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
        return desBaseString;
        
    } else {
        
        NSLog(@"加密失败");
        
    }
    
    return @"";
    
}

// 2. 字符串对称解密(DES)
- (NSString *)desWithString{
    
    NSData *base64Data = [[NSData alloc] initWithBase64EncodedString:self options:NSDataBase64DecodingIgnoreUnknownCharacters];
    
    const void *byte = base64Data.bytes;
    unsigned char buffer[1024];
    size_t dataOutMoved = 0;
    
    // C 语言方法
    CCCryptorStatus cryptorStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, byte, base64Data.length, buffer, 1024, &dataOutMoved);
    
    if (cryptorStatus == kCCSuccess) {
        
        NSLog(@"解密成功");
        NSData *desData = [NSData dataWithBytes:buffer length:dataOutMoved];
        NSString *desBaseString = [[NSString alloc] initWithData:desData encoding:NSUTF8StringEncoding];
        return desBaseString;
        
    } else {
        
        NSLog(@"解密失败");
        
    }
    
    return @"";
    
}

@end
